#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import subprocess
import platform
import shutil
from PIL import Image

def install_requirements():
    """安装依赖包"""
    print("正在安装依赖...")
    subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"])
    # 安装Pillow用于图标生成
    subprocess.check_call([sys.executable, "-m", "pip", "install", "Pillow"])

def create_windows_icon():
    """创建Windows图标文件"""
    try:
        print("正在创建Windows图标...")
        # 创建基础图像（256x256）
        img = Image.new('RGB', (256, 256), color='#2196F3')
        
        # 保存为ICO格式
        img.save('app.ico', format='ICO', sizes=[(16, 16), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)])
        
        # 验证文件是否创建成功
        if not os.path.exists('app.ico'):
            raise Exception("Windows图标文件创建失败")
            
        print("Windows图标文件已创建：app.ico")
        return True
        
    except Exception as e:
        print(f"创建Windows图标文件时出错: {str(e)}")
        # 创建一个空的图标文件以允许构建继续
        try:
            with open('app.ico', 'wb') as f:
                f.write(b'ico')
            print("已创建空图标文件")
            return True
        except:
            print("无法创建空图标文件")
            return False

def create_icons():
    """创建应用图标"""
    if platform.system() == "Darwin":
        print("正在创建macOS图标...")
        try:
            # 导入create_icns模块
            sys.path.append(os.getcwd())
            from create_icns import create_icns
            if not create_icns():
                raise Exception("图标创建失败")
        except Exception as e:
            print(f"创建图标时出错: {str(e)}")
            print("将使用默认图标继续构建...")
            # 创建一个空的图标文件以允许构建继续
            with open('app.icns', 'wb') as f:
                f.write(b'icns')
    else:
        # 创建Windows图标
        create_windows_icon()

def build_executable():
    """构建可执行文件"""
    print("正在构建可执行文件...")
    
    # 清理之前的构建文件
    dist_dir = os.path.join(os.getcwd(), "dist")
    build_dir = os.path.join(os.getcwd(), "build")
    
    if os.path.exists(dist_dir):
        shutil.rmtree(dist_dir)
    if os.path.exists(build_dir):
        shutil.rmtree(build_dir)
    
    # 创建图标
    create_icons()
    
    # 确保图标文件存在
    if platform.system() == "Darwin" and not os.path.exists('app.icns'):
        print("警告：找不到图标文件，将创建空图标文件...")
        with open('app.icns', 'wb') as f:
            f.write(b'icns')
    elif platform.system() == "Windows" and not os.path.exists('app.ico'):
        print("警告：找不到图标文件，将创建空图标文件...")
        with open('app.ico', 'wb') as f:
            f.write(b'ico')
    
    # 使用PyInstaller构建
    subprocess.check_call([sys.executable, "-m", "PyInstaller", "socket_debugger.spec", "--clean"])
    
    print(f"\n构建完成！")
    print(f"可执行文件位置: {dist_dir}")
    
    # 根据操作系统显示不同信息
    if platform.system() == "Windows":
        print("Windows用户可以直接运行dist目录下的exe文件")
    elif platform.system() == "Darwin":
        app_path = os.path.join(dist_dir, "WebSocket调试工具.app")
        if os.path.exists(app_path):
            print(f"macOS应用程序已创建: {app_path}")
            print("你可以：")
            print("1. 直接运行这个应用程序")
            print("2. 将它拖到Applications文件夹中安装")
            
            # 创建dmg
            try:
                print("\n正在创建DMG安装包...")
                dmg_name = "WebSocket调试工具.dmg"
                subprocess.call([
                    "hdiutil",
                    "create",
                    "-volname", "WebSocket调试工具",
                    "-srcfolder", app_path,
                    "-ov",
                    "-format", "UDZO",
                    os.path.join(dist_dir, dmg_name)
                ])
                print(f"DMG安装包已创建: {os.path.join(dist_dir, dmg_name)}")
            except Exception as e:
                print(f"创建DMG失败: {str(e)}")
        else:
            print("警告：应用程序打包似乎失败了")
    else:
        print("Linux用户可以直接运行dist目录下的可执行文件")

    # 清理图标文件
    if os.path.exists('app.icns'):
        os.remove('app.icns')
    if os.path.exists('app.ico'):
        os.remove('app.ico')

if __name__ == "__main__":
    try:
        install_requirements()
        build_executable()
    except Exception as e:
        print(f"构建过程中出错: {str(e)}")
        sys.exit(1) 